// SessionManagerAdapter.ts - 适配层，让现有SessionManager接口使用TokenManager
import TokenManager, { SessionUserInfo } from './TokenManager';

// 模拟SessionInfo接口（与@packages/shared中的SessionInfo保持一致）
export interface SessionInfo {
  userId: number;
  userName: string;
  userRole: string;
  mfaVerified: boolean;
  loginTime: number;
  lastActivity: number;
  ipAddress: string;
  sessionId: string;
}

// 模拟AuditAction枚举
export enum AuditAction {
  LOGIN = 'login',
  LOGIN_FAILED = 'login_failed',
  LOGOUT = 'logout',
  MFA_VERIFY = 'mfa_verify',
  PASSWORD_RESET = 'password_reset',
  SESSION_EXTEND = 'session_extend',
  SESSION_TIMEOUT = 'session_timeout'
}

// 模拟SessionStats接口
interface SessionStats {
  activeSessions: number;
  totalLoginsToday: number;
  averageSessionDuration: number;
}

// 适配层类
class SessionManagerAdapter {
  // 获取当前会话
  getCurrentSession(): SessionInfo | null {
    const userInfo = TokenManager.getUserInfo();
    const tokens = TokenManager.getCurrentTokens();
    
    if (!userInfo || !tokens) {
      return null;
    }

    // 生成模拟的SessionInfo对象
    return {
      userId: userInfo.id,
      userName: userInfo.name,
      userRole: userInfo.role,
      mfaVerified: userInfo.mfaVerified,
      loginTime: localStorage.getItem('login_time') ? parseInt(localStorage.getItem('login_time') || '0') : Date.now(),
      lastActivity: localStorage.getItem('last_activity') ? parseInt(localStorage.getItem('last_activity') || '0') : Date.now(),
      ipAddress: localStorage.getItem('ip_address') || '127.0.0.1', // 模拟IP地址
      sessionId: tokens.accessToken.substring(0, 16) // 使用accessToken的一部分作为sessionId
    };
  }

  // 检查会话是否有效
  isSessionValid(): boolean {
    return TokenManager.isAccessTokenValid();
  }

  // 创建会话
  async createSession(userId: number, userName: string, userRole: string, mfaVerified: boolean): Promise<SessionInfo> {
    // 记录登录时间和IP地址
    const now = Date.now();
    localStorage.setItem('login_time', now.toString());
    localStorage.setItem('last_activity', now.toString());
    localStorage.setItem('ip_address', '127.0.0.1'); // 模拟IP地址

    // 创建用户信息对象
    const userInfo: SessionUserInfo = {
      id: userId,
      name: userName,
      role: userRole,
      mfaVerified: mfaVerified
    };

    // 创建双token
    TokenManager.createTokens(userInfo);

    // 返回模拟的SessionInfo对象
    return {
      userId,
      userName,
      userRole,
      mfaVerified,
      loginTime: now,
      lastActivity: now,
      ipAddress: '127.0.0.1',
      sessionId: TokenManager.getCurrentTokens()?.accessToken.substring(0, 16) || 'mock-session-id'
    };
  }

  // 延长会话
  async extendSession(): Promise<boolean> {
    const refreshedTokens = TokenManager.refreshAccessToken();
    if (refreshedTokens) {
      // 更新最后活动时间
      localStorage.setItem('last_activity', Date.now().toString());
      return true;
    }
    return false;
  }

  // 清除会话
  async clearSession(): Promise<void> {
    TokenManager.clearTokens();
    localStorage.removeItem('login_time');
    localStorage.removeItem('last_activity');
    localStorage.removeItem('ip_address');
  }

  // 检查是否需要重新认证
  needsReauthentication(): boolean {
    return TokenManager.needsReauthentication();
  }

  // 更新活动时间
  async updateActivity(): Promise<void> {
    TokenManager.updateActivity();
    localStorage.setItem('last_activity', Date.now().toString());
  }

  // 获取会话统计（模拟实现）
  getSessionStats(): SessionStats {
    // 模拟统计数据
    return {
      activeSessions: 1,
      totalLoginsToday: Math.floor(Math.random() * 100) + 1,
      averageSessionDuration: 3600 // 1小时
    };
  }

  // 启动自动登出检查
  startAutoLogoutCheck(): void {
    // 设置定期检查令牌有效性的定时器
    const checkInterval = setInterval(() => {
      if (!TokenManager.isAccessTokenValid()) {
        // 检查是否可以刷新令牌
        if (!TokenManager.refreshAccessToken()) {
          // 如果不能刷新令牌，清除会话并提示用户
          console.log('会话已过期，请重新登录');
          this.clearSession();
          window.location.href = '/login';
        }
      }
    }, 60000); // 每分钟检查一次

    // 存储定时器ID以便后续清除
    localStorage.setItem('auto_logout_check_timer', checkInterval.toString());
  }

  // 停止自动登出检查
  stopAutoLogoutCheck(): void {
    const timerId = localStorage.getItem('auto_logout_check_timer');
    if (timerId) {
      clearInterval(parseInt(timerId));
      localStorage.removeItem('auto_logout_check_timer');
    }
  }

  // 获取令牌剩余时间
  getTokenTimeRemaining(): number {
    return TokenManager.getTokenTimeRemaining();
  }

  // 格式化剩余时间显示
  formatTimeRemaining(): string {
    return TokenManager.formatTimeRemaining();
  }
}

// 单例导出
export default new SessionManagerAdapter();